package mq.rabbitmq.b_publish_subscribe;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import mq.rabbitmq.ConnectionUtil;
import mq.rabbitmq.MqConstants;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * publish/subscribe发布订阅模式
 * 特点：
 * 1.每个消费者监听自己的队列；
 * 2.生产者将消息发个broker，由交换机将消息转发到绑定次交换机的每个队列
 * 3.每个绑定交换机的队列都将接受消息
 *
 * @author shanzhenbo
 */
public class Producer {

	public static void main(String[] args) throws IOException, TimeoutException {
		//获取连接
		Connection connection = ConnectionUtil.getConnection();
		//创建频道
		Channel channel = connection.createChannel();
		/*
		 * 声明交换机
		 * 参数1：交换机名称
		 * 参数2：交换机类型：fanout，topic，direct，headers
		 */
		channel.exchangeDeclare(MqConstants.FANOUT_EXCHANGE, BuiltinExchangeType.FANOUT);
		/*
		 * 声明队列1
		 * 参数1：队列名称
		 * 参数2：是否定义持久化队列
		 * 参数3：是否独占本次连接
		 * 参数4：是否在不使用的时候自动删除
		 * 参数5：队列其他参数
		 */
		channel.queueDeclare(MqConstants.FANOUT_QUEUE_1, true, false, false, null);
		//声明队列2
		channel.queueDeclare(MqConstants.FANOUT_QUEUE_2, true, false, false, null);

		//队列绑定交换机
		channel.queueBind(MqConstants.FANOUT_QUEUE_1, MqConstants.FANOUT_EXCHANGE, "");
		channel.queueBind(MqConstants.FANOUT_QUEUE_2, MqConstants.FANOUT_EXCHANGE, "");

		for (int i = 0; i < 10; i++) {
			String message = "发布/订阅模式--num=" + i;
			/*
			 * 发布消息
			 * 参数2：路由key，简单模式可以传递队列名称
			 */
			channel.basicPublish(MqConstants.FANOUT_EXCHANGE, "", null, message.getBytes());
			System.out.println("已发送消息：" + message);
		}

		//关闭资源
		channel.close();
		connection.close();

	}
}
